package dominio

import aerolinea.Asiento
import aerolinea.Primera
import aerolinea.Tramo
import aerolinea.Vuelo
import daos.SessionManager
import excepciones.NuevaPasswordInvalida
import excepciones.UsuarioNoExiste
import excepciones.UsuarioYaExisteException
import java.sql.Connection
import java.sql.DriverManager
import java.sql.PreparedStatement
import java.util.Random
import servicios.AerolineaManager
import servicios.UsuarioManager

import static extension daos.SessionManager.*

class Sistema {
	
	Connection conexion = null
	PreparedStatement ps = null
	
	def registrarUsuario(Usuario nuevoUsuario){
		/*try{
			openConnection
			val codValid = getRandom
			ps= conexion.prepareStatement(
					"INSERT 
					 INTO USUARIO (NOMBRE, APELLIDO, USUARIO, PASSWORD, EMAIl, NACIMIENTO, CODVALIDACION, VALIDADO) 
					 VALUES(?,?,?,?,?,?,?,?)")
			ps.setString(1, nuevoUsuario.nombre)
			ps.setString(2, nuevoUsuario.apellido)
			ps.setString(3, nuevoUsuario.nombreUsuario)
			ps.setString(4, nuevoUsuario.password)
			ps.setString(5, nuevoUsuario.email)
			ps.setString(6, nuevoUsuario.fechaNacimiento.toString)
			ps.setInt(7, codValid)
			ps.setBoolean(8, false)
			nuevoUsuario.codValidacion = codValid
			ps.execute
			
		}
		catch(SQLException exc){
			throw new UsuarioYaExisteException
		}
		finally{
			closeConnection
		}*/
		//try{
			nuevoUsuario.setCodValidacion(getRandom)
			new UsuarioManager().registrarUsuario(nuevoUsuario)
		//}catch(Exception e){
			//throw new UsuarioYaExisteException	
		//}
	}
	
	def openConnection(){
		conexion = getConnection
	}
	def closeConnection(){
		if(ps != null)
			ps.close
			
		if(conexion != null)
			conexion.close
	}
	
	def validarCuenta(int codigoValidacion){
		/*openConnection
			conexion.createStatement.execute(
			"UPDATE USUARIO
			 SET validado = true
			 WHERE codvalidacion = "+codigoValidacion)
		closeConnection*/
		SessionManager.getSession().createQuery("UPDATE USUARIO SET valido= true WHERE codigo = " + codigoValidacion)
		
	}
	 
	def getRandom(){
		(new Random().nextDouble() * 1000000)as int
		
		}
		
	def ingresarUsuario(String userName, String password){
		/*openConnection
		var ps= conexion.createStatement.executeQuery("SELECT * FROM USUARIO WHERE usuario = '"+userName+"'")
		if(! ps.next) throw new UsuarioNoExiste	
		var usuarioReturn = new Usuario(ps.getString("NOMBRE"),
					ps.getString("APELLIDO"),
					ps.getString("USUARIO"),
					ps.getString("PASSWORD"),
					ps.getString("EMAIL"),
					ps.getDate("NACIMIENTO"))
		usuarioReturn.codValidacion= ps.getInt("CODVALIDACION")
		closeConnection
		usuarioReturn*/
		var usuario= new UsuarioManager().ingresarUsuario(userName, password)
		if(usuario == null) throw new UsuarioNoExiste
		usuario
	}
	
	def cambiarPassword(String userName, String password, String nuevaPassword){
		/*openConnection
		if(password == nuevaPassword) throw new NuevaPasswordInvalida
		conexion.createStatement.execute(
			"UPDATE USUARIO
			 SET password = '"+nuevaPassword+"'
			 WHERE usuario = '"+userName+"'")
		closeConnection*/
		if(password == nuevaPassword) throw new NuevaPasswordInvalida
		new UsuarioManager().cambiarPassword(userName, password, nuevaPassword)
	}

	private def Connection getConnection() throws Exception {
		Class.forName("com.mysql.jdbc.Driver");
		return DriverManager.getConnection("jdbc:mysql://localhost/usuario?user=root&password=root");
	}	
	

	def static void main(String[] args){
		/*var s= new Sistema
		var utilDate = new java.util.Date(); //fecha actual
  		var lnMilisegundos = utilDate.getTime();
  		var sqlDate = new Date(lnMilisegundos);
  		//Registro primer usuario
		s.registrarUsuario(new Usuario("unNombre", "unApellido", "userName", "unPassword","unMail", sqlDate))
		//Registro segundo usuario
		s.registrarUsuario(new Usuario("otroNombre", "otroApellido", "otroUserName", "otroPassword","otroMail", sqlDate))
		//Ingreso como primer usuario e imprimo datos
		var u= s.ingresarUsuario("userName", "unPassword")
		println(u.nombre+","+u.apellido+","+u.nombreUsuario+","
				+u.password+","+u.email+","+u.fechaNacimiento+","+u.codValidacion)
		s.validarCuenta(u.codValidacion)
		//Cambio password de primer usuario, ingreso e imprimo datos
		s.cambiarPassword("userName", "unPassword", "nuevaPassword")
		var u2= s.ingresarUsuario("userName", "nuevaPassword")		
		println(u2.nombre+","+u2.apellido+","+u2.nombreUsuario+","
				+u2.password+","+u2.email+","+u2.fechaNacimiento)*/
				var a= new Asiento(2, new Primera(300))
		var a1= new Asiento(2, new Primera(300))
		var a2= new Asiento(2, new Primera(300))
		var a3= new Asiento(2, new Primera(300))
		var asientos= newArrayList
		asientos.add(a)
		asientos.add(a1)
		asientos.add(a2)
		asientos.add(a3)
		var t= new Tramo("Argentina", "Brasil", null, null, 200, asientos)
		var t1= new Tramo("Brasil", "España", null, null, 200, asientos)
		var t2= new Tramo("España", "China", null, null, 200, asientos)
		var t3= new Tramo("China", "Japon", null, null, 200, asientos)
		var tramos= newArrayList
		tramos.add(t)
		tramos.add(t1)
		tramos.add(t2)
		tramos.add(t3)
		var v= new Vuelo(12, tramos)
		var v1= new Vuelo(13, tramos)
		var vuelos= newArrayList
		vuelos.add(v)
		vuelos.add(v1)
				new AerolineaManager().crearAerolinea("LAPA", vuelos)
				new AerolineaManager().crearAerolinea("AR", vuelos)
	}
}